package gob.cgr.web.sgrh.managed;

import gob.cgr.sgrh.ejb.entidad.Documento;
import gob.cgr.sgrh.ejb.entidad.Legajo;
import gob.cgr.sgrh.ejb.entidad.Personal;
import gob.cgr.sgrh.ejb.entidad.SeccionLegajo;
import gob.cgr.sgrh.ejb.entidad.SolicitudLegajo;
import gob.cgr.web.sgrh.service.SigerhService;
import gob.cgr.web.sgrh.util.FTPUtil;
import gob.cgr.web.sgrh.util.Utilitario;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
import javax.inject.Inject;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;



@ManagedBean
@ViewScoped
public class SolicitudActualizarLegajoMB  {
	
	
	@Inject
	SigerhService service;
	
	private Personal colaborador;
	private SolicitudLegajo solicitud;
	private SolicitudLegajo solicitudSelected;
	private Legajo legajo;
	private List<SolicitudLegajo> solicitudes;
	private Date desde=new Date();
	private Date hasta=new Date();
	private String estadoSolicitud;
	private List<SelectItem> listaEstadosSolicitud;
	private UploadedFile	file;
	private List<Documento> tipoDocumentos;
	private List<SeccionLegajo> secciones;
	
	@ManagedProperty(value="#{usuarioMB}")
	UsuarioMB usuarioMB;
	
	public SolicitudActualizarLegajoMB() {
	// TODO Auto-generated constructor stub
		System.out.println("SolicitudDocumentoMB constructor");
	}

	@PostConstruct
	public void init(){
		System.out.println("iniciando solicitud");
		//solicitud=new SolicitudDocumento();
		//solicitud.setTipoDocumento(new Documento());
		secciones=service.listarSeccionesLegajoParaSolicitud();
		if(listaEstadosSolicitud==null){
			listaEstadosSolicitud=new ArrayList<SelectItem>();
			SelectItem item=new SelectItem("","Todas");
			SelectItem item1=new SelectItem("P","PENDIENTE");
			SelectItem item2=new SelectItem("A","ANULADA");
			SelectItem item3=new SelectItem("V","VERIFICADA");
			listaEstadosSolicitud.add(item);
			listaEstadosSolicitud.add(item1);
			listaEstadosSolicitud.add(item2);
			listaEstadosSolicitud.add(item3);
		}
		Calendar c=Calendar.getInstance();
		hasta=c.getTime();
		c.roll(Calendar.MONTH, -1);
		desde=c.getTime();
		listarSolicitudes();
		nuevaSolicitud();
		tipoDocumentos=service.listarDocumentosPorTipo("LEGAJO");
	}
	
	public void nuevaSolicitud(){
		solicitud=new SolicitudLegajo();
		solicitud.setIdPersonal(getColaborador());
		legajo=new Legajo();
		legajo.setIdPersonal(getColaborador());
		legajo.setIdSeccionLegajo(new SeccionLegajo());
		legajo.setIdDocumento(new Documento());
		file=null;
		System.out.println("legajo documento "+legajo.getIdDocumento());
	}
	

	public Personal getColaborador() {
		colaborador=service.buscarPersonalPorDNI(usuarioMB.getUser().getIdPersona().getNroDocumento());
				
		return colaborador;
	}


	public void setColaborador(Personal colaborador) {
		this.colaborador = colaborador;
	}


	public SolicitudLegajo getSolicitud() {
		return solicitud;
	}


	public void setSolicitud(SolicitudLegajo solicitud) {
		this.solicitud = solicitud;
	}


	public List<SolicitudLegajo> getSolicitudes() {
		return solicitudes;
	}


	public void setSolicitudes(List<SolicitudLegajo> solicitudes) {
		this.solicitudes = solicitudes;
	}


	public Date getDesde() {
		return desde;
	}


	public void setDesde(Date desde) {
		this.desde = desde;
	}


	public Date getHasta() {
		return hasta;
	}


	public void setHasta(Date hasta) {
		this.hasta = hasta;
	}


	public String getEstadoSolicitud() {
		return estadoSolicitud;
	}


	public void setEstadoSolicitud(String estadoSolicitud) {
		this.estadoSolicitud = estadoSolicitud;
	}
	
	public UsuarioMB getUsuarioMB() {
		return usuarioMB;
	}

	public void setUsuarioMB(UsuarioMB usuarioMB) {
		this.usuarioMB = usuarioMB;
	}

	public void registrarNuevaSolicitud(){
		System.out.println("registrando la solicitud "+usuarioMB.getUser());
		try {
			//nuevaSolicitud();
			Personal p=getColaborador();
			solicitud.setIdPersonal(p);
			String nombreArchivo=guardarArchivo();
			if(nombreArchivo==null){
				return;
			}
			legajo.setArchivo(nombreArchivo);
			legajo.setIdPersonal(getColaborador());
			service.solicitarActualizarLegajo(solicitud,legajo);
			Utilitario.mostrarMensajeExito("La solicitud de documento se ha realizado correctamente");
			nuevaSolicitud();
			listarSolicitudes();
		} catch (Exception e) {
			// TODO: handle exception
			Utilitario.mostrarMensajeAlerta("No se pudo registrar la solicitud." +e.getMessage());
		}
		
		
	}

	
	
	
	public List<SelectItem> getListaEstadosSolicitud() {
		return listaEstadosSolicitud;
	}

	public void setListaEstadosSolicitud(List<SelectItem> listaEstadosSolicitud) {
		this.listaEstadosSolicitud = listaEstadosSolicitud;
	}
	
	public void listarSolicitudes(){
			solicitudes=service.listarSolicitudesDeLegajo(getColaborador().getIdPersonal(), desde, hasta, estadoSolicitud);
	}
	
	public void eliminarSolicitud(){
		if(solicitudSelected==null){
			Utilitario.mostrarMensajeAlerta("Seleccione la solicitud a anular");
			return;
		}
		
		
		try {
			//solicitudSelected.setEstado("A");//Anulada
			System.out.println("eliminando la solicitud de legajo");
			service.eliminarSolicitudLegajo(solicitudSelected);
			Utilitario.mostrarMensajeExito("Se ha eliminado la solicitud de documento");
			listarSolicitudes();
		} catch (Exception e) {
			// TODO: handle exception
			Utilitario.mostrarMensajeAlerta("Ha ocurrido un error al intentar anular la solicitud : "+e.getMessage());
		}
		
	}

	public SolicitudLegajo getSolicitudSelected() {
		return solicitudSelected;
	}

	public void setSolicitudSelected(SolicitudLegajo solicitudSelected) {
		this.solicitudSelected = solicitudSelected;
	}

	public Legajo getLegajo() {
		return legajo;
	}

	public void setLegajo(Legajo legajo) {
		this.legajo = legajo;
	}
	
	private String guardarArchivo(){
		if(file==null)return null;
		FTPUtil clientFTP=new FTPUtil();
		
		try {
			String carpetaPersonal=Utilitario.getCarpetaLegajo()+legajo.getIdPersonal().getCodigoPersonal();
			
			if(new File(carpetaPersonal).exists()==false){
				System.out.println("creando carpeta "+carpetaPersonal+"porque no exixtia ");
				new File(carpetaPersonal).mkdir();
			}
			clientFTP.connect();
			boolean r=clientFTP.crearCarpeta(legajo.getIdPersonal().getCodigoPersonal());
			clientFTP.disconnect();
			System.out.println("se creo en el FTP la carpeta ?"+r);
			
			int numChars=file.getFileName().length() - (file.getFileName().lastIndexOf(".")+1);
			String extension=Utilitario.izquierda(file.getFileName(),numChars);
			String newFileName =generateNumber()+"_temp."+extension;
			System.out.println("fileName:"+newFileName);
			File fileAguardar = new File(carpetaPersonal+"/"+ newFileName);
			System.out.println("file " + fileAguardar.getAbsolutePath());
			FileOutputStream fos = new FileOutputStream(fileAguardar);
			InputStream is = file.getInputstream();
			int BUFFER_SIZE = 8192;
			byte[] buffer = new byte[BUFFER_SIZE];
			int a;
			while (true) {
				a = is.read(buffer);
				if (a < 0)
					break;
				fos.write(buffer, 0, a);
				fos.flush();
			}
			fos.close();
			is.close();
			
			clientFTP.connect();
			clientFTP.guardarLegajo(fileAguardar,null,legajo.getIdPersonal().getCodigoPersonal());
			clientFTP.disconnect();
			fileAguardar.delete();
			
			System.out.println("se guardo el legajo ");
			return newFileName;
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("error al guardar el legajo " + e.getMessage());
			Utilitario.mostrarMensajeAlerta("No se pudo guardar el archivo elegido");
			return null;
		}
		
		
		
	}

	private String generateNumber(){
		int idx=solicitudes.size()==0?1:solicitudes.size()+1;
		return usuarioMB.getUser().getIdPersona().getNroDocumento()+String.format("%1$ty%1$tm%1$td%1$tl",new Date() )+idx;
		
	}
	
	public void handleFileUpload(FileUploadEvent e) {
		try {
			setFile(e.getFile());
			//foto = new DefaultStreamedContent(file.getInputstream());// ,
		}catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
	}

	public List<Documento> getTipoDocumentos() {
		return tipoDocumentos;
	}

	public void setTipoDocumentos(List<Documento> tipoDocumentos) {
		this.tipoDocumentos = tipoDocumentos;
	}

	public UploadedFile getFile() {
		return file;
	}

	public void setFile(UploadedFile file) {
		this.file = file;
	}

	public List<SeccionLegajo> getSecciones() {
		return secciones;
	}

	public void setSecciones(List<SeccionLegajo> secciones) {
		this.secciones = secciones;
	}
}
